#include <bits/stdc++.h>
using namespace std;

/*
3541. 找到频率最高的元音和辅音
已解答
简单
相关标签
premium lock icon
相关企业
提示
给你一个由小写英文字母（'a' 到 'z'）组成的字符串 s。你的任务是找出出现频率 最高 的元音（'a'、'e'、'i'、'o'、'u' 中的一个）和出现频率最高的辅音（除元音以外的所有字母），并返回这两个频率之和。

注意：如果有多个元音或辅音具有相同的最高频率，可以任选其中一个。如果字符串中没有元音或没有辅音，则其频率视为 0。

一个字母 x 的 频率 是它在字符串中出现的次数。
 

示例 1：

输入: s = "successes"

输出: 6

解释:

元音有：'u' 出现 1 次，'e' 出现 2 次。最大元音频率 = 2。
辅音有：'s' 出现 4 次，'c' 出现 2 次。最大辅音频率 = 4。
输出为 2 + 4 = 6。
示例 2：

输入: s = "aeiaeia"

输出: 3

解释:

元音有：'a' 出现 3 次，'e' 出现 2 次，'i' 出现 2 次。最大元音频率 = 3。
s 中没有辅音。因此，最大辅音频率 = 0。
输出为 3 + 0 = 3。
 

提示:

1 <= s.length <= 100
s 只包含小写英文字母
*/

// 法一
class Solution {
public:
    int maxFreqSum(string s) {
        // 用于快速判断字符是否为元音  去重哈希
        unordered_set<char> vowels = {'a', 'e', 'i', 'o', 'u'};
        // max 频率
        int max_vowel = 0, max_consonant = 0;

        // cnt array 
        vector<int> vowel_cnt(26, 0);
        vector<int> consonant_cnt(26, 0);

        // 每个字符foreach
        for (char c : s) {
            if (vowels.count(c)) {
                // 元音
                int idx = c - 'a';      // 0-25
                vowel_cnt[idx]++;  // 该元音计数+1
                // 更新元音最高频率
                if (vowel_cnt[idx] > max_vowel)      max_vowel = vowel_cnt[idx];   
            } else {
                int idx = c - 'a';
                consonant_cnt[idx]++; // 该辅音计数+1
                // 更新辅音最高频率
                if (consonant_cnt[idx] > max_consonant)  max_consonant = consonant_cnt[idx];
            }
        } 
        // 返回最高元音频率与最高辅音频率之和
        return max_vowel + max_consonant;
    }
};

// 法二
class Solution {
public:
    int maxFreqSum(string s) {
        // nY：存储元音字母的最高频率，初始为0
        // nF：存储辅音字母的最高频率，初始为0
        int nY = 0, nF = 0;
        // temp数组：用于统计每个字符的出现次数（利用ASCII码作为索引，覆盖所有小写字母）
        char temp[256] = {0};
        
        // 第一遍遍历：统计字符串中每个字符的出现频率
        for (const auto& ch : s) {
            temp[ch] += 1; // 对应字符的计数+1
        }

        // 第二遍遍历：确定元音和辅音的最高频率
        for (const auto& ch : s) {
            // 判断当前字符是否为元音（a,e,i,o,u）
            if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
                // 若当前元音的频率高于已知最高元音频率，更新最高频率
                if (temp[ch] > nY) {
                    nY = temp[ch];
                }
            } else {
                // 辅音：若当前辅音的频率高于已知最高辅音频率，更新最高频率
                if (temp[ch] > nF) {
                    nF = temp[ch];
                }
            }
        }

        // 返回最高元音频率与最高辅音频率之和
        return nF + nY;
    }
};